#if !defined(__OTA_ADMIN_H__)
#define __OTA_ADMIN_H__

#include <stdint.h>
#include "ota.h"

// #define ENABLE_SOCKET_HTTP

#define OTA_ADMIN_TIMEOUT 20000 /* 超时时间 30s(20s刷新一次) */

#define OTA_ADMIN_STATUS_OK 0                      /* 已完成 */
#define OTA_ADMIN_STATUS_ERROR_PARAMETERS 1        /* 参数错误: 参数不完整 */
#define OTA_ADMIN_STATUS_ERROR_NO_AUTH 2           /* 设备没有被授权 */
#define OTA_ADMIN_STATUS_ERROR_NO_FRAME 3          /* 当前设备所属项目没有绑定固件 */
#define OTA_ADMIN_STATUS_ERROR_NO_FIND_FRAME 4     /* 服务器出错: 没有找到固件信息 */
#define OTA_ADMIN_STATUS_ERROR_NO_VERSION 5        /* 当前设备所属项目绑定的固件没有发布过版本 */
#define OTA_ADMIN_STATUS_ERROR_NO_FIND_FRAME_BIN 6 /* 当前设备所属项目绑定的固件没有创建过版本信息 */
#define OTA_ADMIN_STATUS_ERROR_NO_FIND_TEST 7      /* 当前设备所属项目绑定的固件没有创建过测试版本信息 */
#define OTA_ADMIN_STATUS_ERROR_VERSION 8           /* 参数 version 格式错误 */
#define OTA_ADMIN_STATUS_ERROR_NO_PARTITION 9      /* 参数 partition 错误, 没有指定的分区 */
#define OTA_ADMIN_STATUS_ERROR_NO_FIND_FILE 10     /* 服务器出错: 没有找到固件分区文件, 疑似丢失 */
#define OTA_ADMIN_STATUS_ERROR_TIMEOUT 20          /* 参数 key 超过 服务器指定最大范围时间, 请同步服务器时间 */
#define OTA_ADMIN_STATUS_ERROR_NO_PROJECT 21       /* 不存在项目ID */
#define OTA_ADMIN_STATUS_ERROR_CHECK_FAILED 22     /* 通讯帧密钥校验失败 */
#define OTA_ADMIN_STATUS_OK_NO_NEED_TO_UPDATE 100  /* 当前设备版本已是最新版本, 无需更新 */
const char *const ota_admin_get_status_str(uint16_t status);

#ifdef ENABLE_SOCKET_HTTP
typedef uint8_t (*http_stream_cb_t)(void *user_data, uint8_t *data, uint32_t size);
int8_t http_request(const char *method, char *server, char *port, char *path, const char *data, uint32_t data_len, http_stream_cb_t cb, void *user_cb, bool need_header);
int8_t http_get(char *server, char *port, char *path, const char *data, uint32_t data_len, http_stream_cb_t cb, void *user_cb, bool need_header);
int8_t http_post(char *server, char *port, char *path, const char *data, uint32_t data_len, http_stream_cb_t cb, void *user_cb, bool need_header);
int8_t http_request_from_url(const char *method, char *url, const char *data, uint32_t data_len, http_stream_cb_t cb, void *user_cb, bool need_header);
#endif

typedef struct ota_admin_data
{
    char *url;            /* 服务器URL */
    char *id;             /* 项目ID */
    char *token;          /* 项目密钥 */
    char *mac;            /* 当前设备MAC地址 */
    char *version;        /* 当前设备版本 */
    uint16_t version_num; /* 当前设备版本号 */
} ota_admin_data_s, *ota_admin_data_t;

/**
 *  @description: ota_admin 循环处理函数
 *  @param {ota_admin_t} admin_handle   : ota_admin 句柄
 * */
void ota_admin_loop(void *admin);
/**
 *  @description: 初始化 ota_admin 对象
 *  @param {ota_admin_t} admin_handle   : ota_admin 句柄
 *  @param {ota_admin_data_t} data      : ota_admin_data_t 数据
 * */
void ota_admin_init(void *admin_handle, ota_admin_data_t data);
/**
 *  @description: 创建 ota_admin 对象
 *  @param {ota_admin_data_t} data
 *  @return {*} ota_admin 句柄
 * */
void *ota_admin_create(ota_admin_data_t data);
/**
 *  @description: 开启/关闭 获取 测试 固件
 *  @param {ota_admin_t} admin_handle   : ota_admin 句柄
 *  @param {ota_admin_data_t} enable    : 1:开启 获取 测试 固件
 * */
void ota_admin_get_test(void *admin_handle, uint8_t enable);
/**
 *  @description: ota admin 对接端口初始化
 *  @param {ota_admin_data_t} data
 *  @return {*} 句柄
 * */
void *ota_admin_port_init(ota_admin_data_t data);
/**
 *  @description: 获取当前设备的IP地址
 *  @return {*} IP地址 / 0.0.0.0
 * */
char *ota_admin_port_get_ip(void);
/**
 *  @description: 获取当前设备的运行时间(单位ms)
 *  @return uint32_t 运行时间
 * */
uint32_t ota_admin_port_get_time(void);

#endif // __OTA_ADMIN_H__
